/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;
import DTOsWS.MinimumCustomerFieldsDTO;
import java.awt.Checkbox;
import java.awt.Component;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import javax.swing.DefaultListModel;
import javax.swing.JCheckBox;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


public class ElementoMcfDTO extends Observable{
    private String txtSalida;
    private Element ElementoMcfDTO;
    private Document docMcf=null;
    private int idMayorMcf=0;
    private boolean nuevoMcf=false;
    private DefaultListModel modeloListaMcf = new DefaultListModel();  

    /**
     * @return the ElementoMcfDTO
     */
    public Element getElementoMcfDTO() {
        return ElementoMcfDTO;
    }

    
    /**
     * @param ElementoMcfDTO the ElementoMcfDTO to set
     */
    public void setElementoMcfDTO(Element ElementoMcfDTO) {
        this.ElementoMcfDTO = ElementoMcfDTO;
    }
    
    public ElementoMcfDTO(){
 
    }
    
    @Override
    public String toString(){
        String cad= "McfDTO "+this.getElementoMcfDTO().getAttributeValue("id");
        cad+=" - "+this.getElementoMcfDTO().getAttributeValue("descripcion");
        return cad;
    }

public void vaciaCamposMcf() {  //pendiente de modificar
        FormDTOs a = vista.FormDTOs.getInstance();
        for(Component aux:a.getPanelChksMcfDTO().getComponents())
        {
            if (aux.getClass()==JCheckBox.class)
            {
                JCheckBox aux2=(JCheckBox)aux;
                aux2.setSelected(false);
            }
        }
        a.getComentariosMcfDTO().setText("");
}


public Element armaNuevoElementMcf() {
    Element mcfDto= new Element("McfDTO");
    mcfDto.setAttribute("id",String.valueOf(getIdMayorMcf()+1));
    mcfDto.setAttribute("descripcion",vista.FormDTOs.getInstance().getComentariosMcfDTO().getText());
    Element birthdate = new Element("birthdate").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfBirthdateShow().isSelected()));
    mcfDto.addContent(birthdate);
    Element dni = new Element("dni").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfDniShow().isSelected()));
    mcfDto.addContent(dni);
    Element name = new Element("name").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfNameShow().isSelected()));
    mcfDto.addContent(name);  
    Element surname = new Element("surname").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfSurnameShow().isSelected()));
    mcfDto.addContent(surname);      
    Element category = new Element("category").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfCategoryShow().isSelected()));
    mcfDto.addContent(category);      
    Element expirationDate = new Element("expirationDate").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfExpirationDateShow().isSelected()));
    mcfDto.addContent(expirationDate);      
    return mcfDto;
}
    
public boolean actualizaValoresEnDocMcf(int idItemElegido) { 
    boolean todoOk=false;
    if ((!isNuevoMcf())&& (idItemElegido>=0)){ 
        //si no es nuevo, es porque estoy modificando alguno de los seleccionados
        Element e = obtieneMcfElegido(idItemElegido);
        if (e != null) {
            e.setAttribute("descripcion", vista.FormDTOs.getInstance().getComentariosMcfDTO().getText());
            e.getChild("birthdate").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfBirthdateShow().isSelected()));            
            e.getChild("dni").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfDniShow().isSelected()));            
            e.getChild("name").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfNameShow().isSelected()));                        
            e.getChild("surname").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfSurnameShow().isSelected()));
            e.getChild("category").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfCategoryShow().isSelected()));            
            e.getChild("expirationDate").setAttribute("Show",String.valueOf(vista.FormDTOs.getInstance().getChkMcfExpirationDateShow().isSelected()));                        
            todoOk=true;
        }
    }
    else
        { //se arma el Element que representará el nuevo ElementoMcfDTO
          //con los valores especificados por el usuario
          Element mcfNuevo = armaNuevoElementMcf();  
          getDocMcf().getRootElement().addContent(mcfNuevo);
          todoOk=true;                                 
        } 
    return todoOk;
}

public FileInputStream abreArchivoMcf(String nombre) throws JDOMException{
        //Intentamos abrir el archivo, y si no existe lo creamos
        String ruta =System.getProperty("user.dir")+"\\"+nombre+"s.xml";
        FileInputStream archivo=null;
        boolean exists = (new java.io.File(ruta)).exists(); 
        if (exists) { 
            try { archivo = new FileInputStream(ruta); }
            catch (IOException e) { System.out.println(e); 
                setTxtSalida("No se pudo abrir "+ruta); 
            }
        }
        else {
            try { java.io.File file = new java.io.File(ruta);
                  // Create file if it does not exist
                  boolean success = file.createNewFile();
                  boolean sePuedeLeer = file.canRead();
                  try { archivo = new FileInputStream(ruta); 
                        // Creamos el builder basado en SAX      
                        SAXBuilder builder = new SAXBuilder();  
                        // Construimos el arbol DOM
                        //setDocMcf(builder.build(archivo));
                        setDocMcf(new Document());
                        // Le agregamos el root element que corresponda y lo guardamos
                        Element rootElement = new Element("Elementos"+nombre);
                        getDocMcf().addContent(rootElement);
                        guardaXMLmcf();
                        setDocMcf(null);
                  }
                  catch (IOException e) { System.out.println(e); 
                      setTxtSalida("No se pudo abrir "+ruta); 
                  }
            } catch (IOException e) {
                System.out.println(e); 
                setTxtSalida("No se pudo crear "+ruta);
            }
         }
     return archivo;   
}

public boolean validaCamposMcf(){    
    //validamos los datos ingresados en ElementoMcfDTO
    boolean noErrorMcfDTO=true;   
    FormDTOs pantalla=FormDTOs.getInstance();
    noErrorMcfDTO=pantalla.getComentariosMcfDTO().getText().length()>0;    
    if (!(noErrorMcfDTO)){
        setTxtSalida("Verifique los datos especificados en MinimumCustomerFieldsDTO");
    }
    return noErrorMcfDTO;
}


public DefaultListModel LeeXMLmcf() {
    getModeloListaMcf().clear();
    //SAXBuilder se encarga de cargar el archivo XML del disco o de un String
    // Creamos el builder basado en SAX      
    SAXBuilder builder = new SAXBuilder();  
    try {
        //abrimos el archivo
        FileInputStream archivo = abreArchivoMcf("McfDTO");        
        // Construimos el arbol DOM a partir del fichero xml  y Cargamos el documento
         setDocMcf(builder.build(archivo));
         // Obtenemos la etiqueta raíz  
         Element raiz = getDocMcf().getRootElement();  
         // Recorremos los hijos de la etiqueta raíz  
         List<Element> hijosRaiz = raiz.getChildren();  
         for(Element ElementoMcfDTO: hijosRaiz){  
            // Obtenemos el nombre y su contenido de tipo texto  
            String nombre = ElementoMcfDTO.getName();  
            String texto = ElementoMcfDTO.getValue();       
            //System.out.println("\n Etiqueta: "+nombre+". Texto: "+texto);

            // Obtenemos el atributo id si lo hubiera
            String id = ElementoMcfDTO.getAttributeValue("id");  
            if(id!=null){  
                if (getIdMayorMcf()<Integer.valueOf(id))
                  {     setIdMayorMcf((int) Integer.valueOf(id)); }
                id=" id: "+id;
            }
            else { id=""; }
            // Obtenemos el atributo descripcion si lo hubiera              
            String descripcion = ElementoMcfDTO.getAttributeValue("descripcion");  
            if(descripcion!=null){  
                descripcion="- Descripcion: "+descripcion;
            }
            else { descripcion=""; } 
            ElementoMcfDTO elemMcfDTO = new ElementoMcfDTO();
            elemMcfDTO.setElementoMcfDTO(ElementoMcfDTO);            
            //getModeloListaMcf().addElement(nombre+id+descripcion);
            getModeloListaMcf().addElement(elemMcfDTO);
         }   
        }catch (JDOMException ex) {
            //1todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            //1 todoOk=false;
            Logger.getLogger(FormDTOs.class.getName()).log(Level.SEVERE, null, ex);
        }       
    return getModeloListaMcf();
}

public void guardaXMLmcf() { 
        // Vamos a serializar el XML. Lo primero es obtener el formato de salida  
        // Partimos del "Formato bonito", aunque también existe el plano y el compacto  
        Format format = Format.getPrettyFormat();  
        // Creamos el serializador con el formato deseado  
        XMLOutputter xmloutputter = new XMLOutputter(format);  
        // Serializamos el document parseado  
        //String docStr = xmloutputter.outputString(docMcf);          
        try{
            String filename="McfDTOs.xml";
            FileOutputStream file = new FileOutputStream(filename);
            xmloutputter.output(getDocMcf(),file);
            file.flush();
            file.close();
            //xmloutputter.output(this.pagDTO.getDocMcf(),System.out);
            setTxtSalida("Se guardaron correctamente los cambios en el archivo "+filename);
            setNuevoMcf(false);
            vista.FormDTOs.getInstance().leeXMLsyActualizaInterfaz();
        }catch(Exception e){
            e.printStackTrace();
            setTxtSalida("No se pudieron guardar los datos en el archivo");
        }
}

public Element obtieneMcfElegido(int idItemElegido) {
    Element e=null;    
    boolean encontro=false;    
    if (idItemElegido>=0) {        
        Element raiz= getDocMcf().getRootElement();
        List<Element> lista=raiz.getChildren("McfDTO");
        int i=0;
        while ((i<lista.size()) && (!(encontro))){
          e = lista.get(i);
          if (e.getAttributeValue("id").equals(String.valueOf(idItemElegido)))
            { encontro=true; }
          i++;
        }
    }
    if (!(encontro)){
        e=null;
    }
    return e;
}

public MinimumCustomerFieldsDTO elemElegido2DTO(int idItemElegido) { 
    MinimumCustomerFieldsDTO mcfdto = null;
    Element elemElegido = obtieneMcfElegido(idItemElegido);
    if (elemElegido != null) {
        mcfdto.setShowBirthdate(Boolean.valueOf(elemElegido.getChild("birthdate").getAttributeValue("Show")));
        mcfdto.setShowDNI(Boolean.valueOf(elemElegido.getChild("dni").getAttributeValue("Show")));
        mcfdto.setShowName(Boolean.valueOf(elemElegido.getChild("name").getAttributeValue("Show")));        
        mcfdto.setShowSurname(Boolean.valueOf(elemElegido.getChild("surname").getAttributeValue("Show")));        
        mcfdto.setShowCategory(Boolean.valueOf(elemElegido.getChild("category").getAttributeValue("Show")));        
        mcfdto.setShowExpirationDate(Boolean.valueOf(elemElegido.getChild("expirationDate").getAttributeValue("Show")));                
    }
    return mcfdto;
}
        
    public Document getDocMcf() {
        return docMcf;
    }

    /**
     * @param docMcf the docMcf to set
     */
    public void setDocMcf(Document docMcf) {
        this.docMcf = docMcf;
    }

    /**
     * @return the idMayorMcf
     */
    public int getIdMayorMcf() {
        return idMayorMcf;
    }

    /**
     * @param idMayorMcf the idMayorMcf to set
     */
    public void setIdMayorMcf(int idMayorMcf) {
        this.idMayorMcf = idMayorMcf;
    }

    /**
     * @return the nuevoMcf
     */
    public boolean isNuevoMcf() {
        return nuevoMcf;
    }

    /**
     * @param nuevoMcf the nuevoMcf to set
     */
    public void setNuevoMcf(boolean nuevoMcf) {
        this.nuevoMcf = nuevoMcf;
    }

    /**
     * @return the modeloListaMcf
     */
    public DefaultListModel getModeloListaMcf() {
        return modeloListaMcf;
    }

    /**
     * @param modeloListaMcf the modeloListaMcf to set
     */
    public void setModeloListaMcf(DefaultListModel modeloListaMcf) {
        this.modeloListaMcf = modeloListaMcf;
    }

    public String getTxtSalida() {
        return txtSalida;
        //vista.FormDTOs.getInstance().getTxtSalida();
    }

    /**
     * @param txtSalida the txtSalida to set
     */
    public void setTxtSalida(String txtSalida) {
        this.txtSalida = txtSalida;
        this.setChanged();
        notifyObservers();
        //vista.FormDTOs.getInstance().agregaTxtAsalida(txtSalida);
    }
}
    

